home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / util / misc / OpenLibCounter.lha / Source / OpenLibraryCounter.asm
Assembly Source File  |  1997-09-22  |  15KB  |  814 lines

  1. *******************************************************************************
  2. * OpenLibraryCounter.asm
  3. *******************************************************************************
  4. * Author: Peter Mattsson
  5. * Created: 960505
  6. * Last changed: 970722
  7. *******************************************************************************
  8. * Changes between V1.12ß and V1.13:
  9. * Reading the log file is much safer.
  10. *******************************************************************************
  11. * TODO: Make the removal of the patch even safer.
  12. *    Store what programs open what libraries.
  13. *    Store the library names in a binary search tree to cut search times.
  14. *******************************************************************************
  15.  
  16.         MACHINE    68000
  17.  
  18.         INCDIR    "INCLUDE:"
  19.         INCLUDE    "lvos.i"
  20.         INCLUDE    "dos/dos.i"
  21.         INCLUDE    "exec/exec.i"
  22.  
  23. *******************************************************************************
  24. * Macros
  25. *******************************************************************************
  26.  
  27. CALL        MACRO
  28.         Jsr    _LVO\1(A6)
  29.         ENDM
  30.  
  31. main
  32.     Bsr.S    Initialize
  33.     Tst.L    d0
  34.     Beq.S    .Failed
  35.  
  36.         Bsr.S    ReadArguments
  37.  
  38.         Bsr.S    LinkedListConstructor
  39.         Move.L    userFileName,a0
  40.         Bsr.S    LinkedListLoadListFromFile
  41.  
  42.         Move.L    $4.w,a6
  43.         Move.L    a6,a1
  44.         Move.W    #_LVOOpenLibrary,a0
  45.         Move.L    #MyOpenLibrary,d0
  46.         CALL    SetFunction
  47.         Move.L    d0,oldOpenLibrary
  48. .WaitForMessage
  49.             MoveQ.L    #0,d1
  50.             Move.L    myMessagePort,a0
  51.             Move.B    MP_SIGBIT(a0),d1
  52.             MoveQ.L    #1,d0
  53.             Lsl.L    d1,d0
  54.             Or.L    #SIGBREAKF_CTRL_C,d0
  55.             Move.L    $4.w,a6
  56.             CALL    Wait
  57.             And.L    #SIGBREAKF_CTRL_C,d0
  58.             Bne.S    .QuitProgram
  59. .GetMoreMessages
  60.             Move.L    myMessagePort,a0
  61.             CALL    GetMsg
  62.             Tst.L    d0
  63.             Beq.S    .NoMessage
  64.                 Move.L    d0,a0
  65.                 Move.L    d0,-(SP)
  66.                 Lea    20(a0),a0
  67.                 Bsr.S    LinkedListUpdateLibrary
  68.                 Move.L    (SP)+,a1
  69.                 MoveQ.L    #0,d0
  70.                 Move.L    $4.w,a6
  71.                 Move.W    MN_LENGTH(a1),d0
  72.                 CALL    FreeMem
  73.             Bra.S    .GetMoreMessages
  74. .NoMessage
  75.         Bra.S    .WaitForMessage
  76. .QuitProgram
  77.         Move.L    oldOpenLibrary,d0
  78.         Move.W    #_LVOOpenLibrary,a0
  79.         Move.L    $4.w,a6
  80.         Move.L    a6,a1
  81.         CALL    SetFunction
  82.  
  83.         Bsr.S    LinkedListDestructor
  84.  
  85.         Move.L    #500,d1
  86.         Move.L    _DOSBase,a6
  87.         CALL    Delay
  88.  
  89. .removeRemainingMessages
  90.         Move.L    myMessagePort,a0
  91.         Move.L    $4.w,a6
  92.         CALL    GetMsg
  93.         Tst.L    d0
  94.         Beq.S    .noMoreMessages
  95.             Move.L    d0,a1
  96.             MoveQ.L    #0,d0
  97.             Move.L    $4.w,a6
  98.             Move.W    MN_LENGTH(a1),d0
  99.             CALL    FreeMem
  100.         Bra.S    .removeRemainingMessages
  101. .noMoreMessages
  102.  
  103. .Failed
  104.     Bsr.S    ShutDown
  105.         MoveQ.L    #0,d0
  106.  
  107.     Rts
  108.  
  109. *******************************************************************************
  110.  
  111. MyOpenLibrary
  112.     Move.L    a1,-(SP)
  113.     Move.L    oldOpenLibrary,a0
  114.     Jsr    (a0)
  115.     Move.L    (SP)+,a0
  116.     Tst.L    d0
  117.     Beq.S    .NotOpened
  118.     MoveM.L    d0/d2/a2,-(SP)
  119.  
  120.     Move.L    a0,a2
  121.     Bsr.S    strlen
  122.     Add.L    #14+6+1,d0
  123.     Move.W    d0,d2
  124.     MoveQ.L    #MEMF_ANY,d1
  125.     CALL    AllocMem
  126.     Tst.L    d0
  127.     Beq.S    .NoMemory
  128.         Move.L    a2,a0
  129.         Move.L    d0,a1
  130.         Clr.L    (a1)
  131.         Clr.L    LN_PRED(a1)
  132.         Clr.L    LN_NAME(a1)
  133.         Clr.L    MN_REPLYPORT(a1)
  134.         Move.W    d2,MN_LENGTH(a1)
  135.         Clr.W    LN_TYPE(a1)
  136.         Move.L    a1,a2
  137.         Lea    20(a1),a1
  138.         Bsr.S    strcpy
  139.         Move.L    a2,a1
  140.         Move.L    myMessagePort,a0
  141.         CALL    PutMsg
  142. .NoMemory
  143.     MoveM.L    (SP)+,d0/d2/a2
  144. .NotOpened
  145.     Rts
  146.  
  147. *******************************************************************************
  148. * Out : d0 - Nonzero if success
  149.  
  150. Initialize
  151.     Clr.L    _DOSBase
  152.     Clr.L    myMessagePort
  153.     Bsr.S    OpenDOSLibrary
  154.     Tst.L    d0
  155.     Beq.S    .NoSuccess
  156.     Bsr.S    CreateMessagePort
  157. .NoSuccess
  158.     Rts
  159.  
  160. *******************************************************************************
  161. * Out : d0 - Nonzero if success
  162.  
  163. CreateMessagePort
  164.     Move.L    $4.w,a6
  165.     CALL    CreateMsgPort
  166.     Move.L    d0,myMessagePort
  167.  
  168.     Rts
  169.  
  170. *******************************************************************************
  171. * Out : d0 - Nonzero if success
  172.  
  173. OpenDOSLibrary
  174.     Move.L    $4.w,a6
  175.     Lea    DosName,a1
  176.     MoveQ.L    #37,d0                ; Requires KS 2.04
  177.     CALL    OpenLibrary
  178.     Move.L    d0,_DOSBase
  179.  
  180.     Rts
  181.  
  182. *******************************************************************************
  183.  
  184. ShutDown
  185.     Move.L    readArgsStruct,d1
  186.     Beq.S    .noArgsToFree
  187.  
  188.         Move.L    _DOSBase,a6
  189.         CALL    FreeArgs
  190. .noArgsToFree
  191.     Tst.L    myMessagePort
  192.     Beq.S    .NoMessagePortCreated
  193.         Move.L    myMessagePort,a0
  194.         Move.L    $4.w,a6
  195.         CALL    DeleteMsgPort
  196. .NoMessagePortCreated
  197.     Tst.L    _DOSBase
  198.     Beq.S    .NoDosOpened
  199.         Move.L    _DOSBase,a1
  200.         Move.L    $4.w,a6
  201.         CALL    CloseLibrary
  202. .NoDosOpened
  203.     Rts
  204.  
  205. *******************************************************************************
  206.  
  207. ReadArguments
  208.     Lea    ReadArgsTempl,a0
  209.     Move.L    a0,d1
  210.     Lea    readArgsArray,a0
  211.     Clr.L    (a0)
  212.     Clr.L    4(a0)
  213.     Move.L    a0,d2
  214.     MoveQ.L    #0,d3
  215.     Move.L    _DOSBase,a6
  216.  
  217.     CALL    ReadArgs
  218.  
  219.     Move.L    d0,readArgsStruct
  220.     Beq.S    .error
  221.  
  222.         Lea    readArgsArray,a0
  223.         Tst.L    (a0)
  224.         Bne.S    .filenameSpecified
  225.  
  226.         Move.L    #DefaultFileName,userFileName
  227.         Bra.S    .checkInterval
  228. .filenameSpecified
  229.         Move.L    (a0),userFileName
  230. .checkInterval
  231.         Tst.L    4(a0)
  232.         Beq.S    .noIntervalSpecified
  233.  
  234.         Move.L    4(a0),a0
  235.         Move.L    (a0),saveInterval
  236.         Bne.S    .intervalSpecified
  237.  
  238. .noIntervalSpecified
  239.         Move.L    #500,saveInterval
  240. .intervalSpecified
  241.     Bra.S    .noError
  242.  
  243. .error
  244.         Move.L    #DefaultFileName,userFileName
  245.         Move.L    #500,saveInterval
  246.  
  247. .noError
  248.     Rts
  249.  
  250. *******************************************************************************
  251. * In : -
  252. * Out : -
  253.  
  254. LinkedListConstructor
  255.     Clr.L    head
  256.     Move.L    saveInterval,numberOfOpens
  257.     Rts
  258.  
  259. *******************************************************************************
  260. * In : -
  261. * Out : -
  262.  
  263. LinkedListDestructor
  264.     Tst.L    head
  265.     Beq.S    .headIsNull
  266.  
  267.         Move.L    userFileName,a0
  268.         Move.L    head,a2
  269.         Bsr.S    LinkedListSaveListToFile
  270.  
  271.         Move.L    head,a2
  272.         Bsr.S    ListNodeDestructor
  273. .headIsNull
  274.     Rts
  275.  
  276. *******************************************************************************
  277. * In : a0 - char* libraryName
  278. * Out : -
  279.  
  280. LinkedListUpdateLibrary
  281.  
  282.     Move.L    a0,a1
  283.     MoveQ.L    #0,d0
  284. .checkIfNameIsLegal                             ; In this case, no TABs in the name and
  285.                                                 ; shorter than 1024 characters
  286.     Cmp.W    #1024,d0
  287.     Beq.S    .nameIsIllegal
  288.  
  289.     Cmp.B    #'\t',(a0)
  290.     Bne.S    .noTab
  291.     
  292. .nameIsIllegal
  293.     Lea    IllegalLibName,a0
  294.     Bra.S    .nameWasIllegal
  295.  
  296. .noTab
  297.     AddQ.W    #1,d0
  298.  
  299.     Tst.B    (a0)+
  300.     Bne.S    .checkIfNameIsLegal
  301.     
  302.     Move.L    a1,a0
  303.  
  304. .nameWasIllegal
  305.  
  306.     Tst.L    head
  307.     Beq.S    .headIsNull
  308.  
  309.         Move.L    head,a2
  310.         Bsr.S    ListNodeUpdateLibrary
  311.  
  312.         SubQ.L    #1,numberOfOpens
  313.         Bne.S    .notTimeToSave
  314.  
  315.             Move.L    userFileName,a0
  316.             Bsr.S    LinkedListSaveListToFile
  317.  
  318.             Move.L    saveInterval,numberOfOpens
  319. .notTimeToSave
  320.         Bra.S    .headWasNotNull
  321. .headIsNull
  322.         Move.L    a0,a2
  323.  
  324.         MoveQ.L    #ListNodeSizeOf,d0
  325.         MoveQ.L    #MEMF_ANY,d1
  326.         Move.L    $4.w,a6
  327.         CALL    AllocMem
  328.         Move.L    d0,head
  329.         Beq.S    .headWasNotNull
  330.  
  331.         Move.L    a2,a0
  332.         Move.L    d0,a2
  333.         MoveQ.L    #1,d0
  334.         Bsr.S    ListNodeConstructor
  335.  
  336.         Tst.L    d0
  337.         Bne.S    .successful
  338.  
  339.         Clr.L    head
  340.         Bra.S    .noSuccess
  341. .successful
  342.         SubQ.L    #1,numberOfOpens
  343. .headWasNotNull
  344. .noSuccess
  345.     MoveQ.L    #0,d0
  346.     Rts
  347.  
  348. *******************************************************************************
  349. * In : a0 - char* fileName
  350. * Out : -
  351.  
  352. LinkedListSaveListToFile
  353.     Tst.L    head
  354.     Beq.S    .headIsNull
  355.  
  356.         Move.L    _DOSBase,a6
  357.         Move.L    a0,d1
  358.         Move.L    #MODE_NEWFILE,d2
  359.         CALL    Open
  360.         Tst.L    d0
  361.         Beq.S    .saveFileIsNull
  362.  
  363.             Move.L    d0,-(SP)
  364.             Move.L    d0,a0
  365.             Move.L    head,a2
  366.             Bsr.S    ListNodeSaveToFile
  367.  
  368.             Move.L    (SP)+,d1
  369.             Move.L    _DOSBase,a6
  370.             CALL    Close
  371. .saveFileIsNull
  372. .headIsNull
  373.     Rts
  374.  
  375. *******************************************************************************
  376. * In : a0 - char* fileName
  377. * Out : -
  378.  
  379. LinkedListLoadListFromFile
  380.     Move.L    a0,-(SP)
  381.  
  382.     Tst.L    head
  383.     Beq.S    .headIsNull
  384.  
  385.         Move.L    head,a2
  386.         Bsr.S    ListNodeDestructor
  387. .headIsNull
  388.     Move.L    (SP)+,d1
  389.     Move.L    #MODE_OLDFILE,d2
  390.     Move.L    _DOSBase,a6
  391.     CALL    Open
  392.     Move.L    d0,filePointer
  393.     Beq.S    .loadFileIsNull
  394. .whileNotEof
  395.         Lea    aLibraryName,a0
  396.         Lea    anOpenCount,a1
  397.         Move.L    filePointer,a2
  398.         Bsr.S    fscanf
  399.         Move.L    d0,d1
  400.         Cmp.W    #2,d1
  401.         Bne.S    .endOfFileReached
  402.  
  403.             Tst.L    head
  404.             Beq.S    .headIsNull2
  405.  
  406.                 Move.L    head,a2
  407.                 Lea    aLibraryName,a0
  408.                 Move.L    anOpenCount,d0
  409.                 Bsr.S    ListNodeInsertLibrary
  410.                 Bra.S    .headWasNotNull
  411. .headIsNull2
  412.                 MoveQ.L    #ListNodeSizeOf,d0
  413.                 MoveQ.L    #MEMF_ANY,d1
  414.                 Move.L    $4.w,a6
  415.                 CALL    AllocMem
  416.                 Move.L    d0,head
  417.                 Beq.S    .endOfFileReached
  418.  
  419.                 Move.L    d0,a2
  420.                 Lea    aLibraryName,a0
  421.                 Move.L    anOpenCount,d0
  422.                 Bsr.S    ListNodeConstructor
  423.  
  424.                 Tst.L    d0
  425.                 Bne.S    .success
  426.  
  427.                 Clr.L    head
  428. .success
  429. .headWasNotNull
  430.     Bra.S    .whileNotEof
  431. .endOfFileReached
  432.     Move.L    _DOSBase,a6
  433.     Move.L    filePointer,d1
  434.     CALL    Close
  435. .loadFileIsNull
  436.     Rts
  437.  
  438. *******************************************************************************
  439. * In : a0 - char* aLibraryName
  440. *      d0 - unsigned int anOpenCount
  441. *      a2 - ListNode*
  442. * Out : d0 - Nonzero if success, zero if not
  443.  
  444. ListNodeConstructor
  445.     Clr.L    next(a2)
  446.     Move.L    d0,openCount(a2)
  447.     Move.L    a0,a3
  448.     Bsr.S    strlen
  449.     AddQ.L    #1,d0
  450.     MoveQ.L    #MEMF_ANY,d1
  451.     Move.L    $4.w,a6
  452.     CALL    AllocMem
  453.     Move.L    d0,libraryName(a2)
  454.     Beq.S    .allocFailed
  455.         Move.L    a3,a0
  456.         Move.L    d0,a1
  457.         Bsr.S    strcpy
  458.  
  459.     MoveQ.L    #1,d0
  460.     Rts
  461. .allocFailed
  462.         Move.L    a2,a1
  463.         MoveQ.L    #ListNodeSizeOf,d0
  464.         CALL    FreeMem
  465.  
  466.     MoveQ.L    #0,d0
  467.     Rts
  468.  
  469. *******************************************************************************
  470. * In : a2 - ListNode*
  471.  
  472. ListNodeDestructor
  473.  
  474. .killAllNodes
  475.         Move.L    next(a2),a3
  476.  
  477.         Move.L    libraryName(a2),a0
  478.         Move.L    a0,a1
  479.         Bsr.S    strlen
  480.         AddQ.L    #1,d0
  481.         Move.L    $4.w,a6
  482.         CALL    FreeMem
  483.  
  484.         Move.L    a2,a1
  485.         MoveQ.L    #ListNodeSizeOf,d0
  486.         CALL    FreeMem
  487.  
  488.         Move.L    a3,a2
  489.  
  490.     Cmp.W    #0,a2
  491.     Bne.S    .killAllNodes
  492.  
  493.     Rts
  494.  
  495. *******************************************************************************
  496. * In : a0 - char* aLibraryName
  497. *      d0 - unsigned int anOpenCount
  498. *      a2 - ListNode*
  499.  
  500. ListNodeInsertLibrary
  501.  
  502. .findLastNode
  503.         Move.L    next(a2),a3
  504.     
  505.         Cmp.W    #0,a3
  506.         Beq.S    .lastNodeFound
  507.  
  508.         Move.L    a3,a2
  509.     Bra.S    .findLastNode
  510.  
  511. .lastNodeFound
  512.     Move.L    a0,a3
  513.     Move.L    d0,d2
  514.     MoveQ.L    #ListNodeSizeOf,d0
  515.     MoveQ.L    #MEMF_ANY,d1
  516.     Move.L    $4.w,a6
  517.     CALL    AllocMem
  518.     Move.L    d0,next(a2)
  519.     Beq.S    .nextWasNotNull
  520.  
  521.         Move.L    a2,a4
  522.         Move.L    d0,a2
  523.         Move.L    a3,a0
  524.         Move.L    d2,d0
  525.         Bsr.S    ListNodeConstructor
  526.  
  527.         Tst.L    d0
  528.         Bne.S    .success
  529.  
  530.         Clr.L    next(a4)
  531. .success
  532. .nextWasNotNull
  533.     Rts
  534.  
  535. *******************************************************************************
  536. * In : a0 - char* libraryName
  537. *      a2 - ListNode*
  538.  
  539. ListNodeUpdateLibrary
  540.  
  541. .findNode
  542.     Move.L    a0,a3
  543.     Move.L    libraryName(a2),a1
  544.     Bsr.S    strcmp
  545.     Tst.B    d0
  546.     Bne.S    .stringsNotEqual
  547.  
  548.         AddQ.L    #1,openCount(a2)
  549.         Bra.S    .return
  550. .stringsNotEqual
  551.         Tst.L    next(a2)
  552.         Beq.S    .nextIsNull
  553.  
  554.             Move.L    a3,a0
  555.             Move.L    next(a2),a2
  556.             Bra.S    .findNode
  557. .nextIsNull
  558.             MoveQ.L    #ListNodeSizeOf,d0
  559.             MoveQ.L    #MEMF_ANY,d1
  560.             Move.L    $4.w,a6
  561.             CALL    AllocMem
  562.             Move.L    d0,next(a2)
  563.             Beq.S    .return
  564.  
  565.                 Move.L    a2,a4
  566.                 Move.L    d0,a2
  567.                 Move.L    a3,a0
  568.                 MoveQ.L    #1,d0
  569.                 Bsr.S    ListNodeConstructor
  570.  
  571.                 Tst.L    d0
  572.                 Bne.S    .success
  573.  
  574.                 Clr.L    next(a4)
  575. .success
  576. .return
  577.     Rts
  578.  
  579. *******************************************************************************
  580. * In : a0 - filepointer
  581. *      a2 - ListNode*
  582.  
  583. ListNodeSaveToFile
  584.     Move.L    a0,a5
  585.     Move.L    libraryName(a2),a1
  586.     Move.L    openCount(a2),d0
  587.     Bsr.S    fprintf
  588.  
  589.     Move.L    a5,a0
  590.     Tst.L    next(a2)
  591.     Beq.S    .nextIsNull
  592.  
  593.         Move.L    next(a2),a2
  594.         Bra.S    ListNodeSaveToFile
  595. .nextIsNull
  596.     Rts
  597.  
  598. *******************************************************************************
  599. * In : a0 - filepointer
  600. *      a1 - libraryName
  601. *      d0 - openCount
  602. *      a2 - ListNode*
  603.  
  604. fprintf
  605.     Move.L    a0,d1
  606.     
  607.     Lea    variableArray,a0
  608.     Move.L    a0,d3
  609.  
  610.     Move.L    a1,(a0)
  611.     Move.L    d0,4(a0)
  612.  
  613.     Lea    FprintfString,a0
  614.     Move.L    a0,d2
  615.     Move.L    _DOSBase,a6
  616.     CALL    VFPrintf
  617.  
  618.     Rts
  619.  
  620. *******************************************************************************
  621. * In : a0 - char* string1
  622. *      a1 - char* string2
  623. * Out : d0 - byte, Zero if equal
  624.  
  625. strcmp
  626. .whileNotEndOfString
  627.     Move.B    (a0)+,d0
  628.     Move.B    (a1)+,d1
  629.  
  630.     Tst.B    d0
  631.     Bne.S    .string1NotEnd
  632.         Sub.B    d1,d0
  633.         Bra.S    .return
  634. .string1NotEnd
  635.     Tst.B    d1
  636.     Bne.S    .string2NotEnd
  637.         Sub.B    d1,d0
  638.         Bra.S    .return
  639. .string2NotEnd
  640.     Sub.B    d1,d0
  641.     Beq.S    .whileNotEndOfString
  642. .return
  643.     Rts
  644.  
  645. *******************************************************************************
  646. * In : a0 - char* source
  647. *      a1 - char* dest
  648.  
  649. strcpy
  650. .whileNotSourceNull
  651.     Move.B    (a0)+,(a1)+
  652.     Bne.S    .whileNotSourceNull
  653.     Rts
  654.     
  655.  
  656. *******************************************************************************
  657. * In : a0 - char*
  658. * Out : d0 - int stringlength
  659.  
  660. strlen
  661.     MoveQ.L    #-1,d0
  662. .whileStringNotNull
  663.         AddQ.L    #1,d0
  664.  
  665.     Tst.B    (a0)+
  666.     Bne.S    .whileStringNotNull
  667.  
  668.     Rts
  669.  
  670. *******************************************************************************
  671. * In : a0 - string buffer
  672. *      a1 - unsigned int pointer
  673. *      a2 - file pointer, _MUST_ not be altered!
  674. * Out : d0 - number of read fields
  675.  
  676. fscanf
  677.     Move.L    a0,a3
  678.     Move.L    a1,a4
  679.  
  680.     MoveQ.L    #0,d5                           ; Number of bytes read
  681. .whileNotEof
  682.         Move.L    _DOSBase,a6
  683.         Move.L    a2,d1
  684.         CALL    FGetC
  685.         Tst.L    d0
  686.         Bmi.S    .return0
  687.  
  688.             Cmp.B    #'\t',d0
  689.             Beq.S    .readUnsignedLong
  690.  
  691.                 AddQ.W    #1,d5
  692.                 Cmp.W    #1025,d5
  693.                 Beq.S    .return0
  694.  
  695.                 Move.B    d0,(a3)+
  696.     Bra.S    .whileNotEof
  697.  
  698. .readUnsignedLong
  699.     Clr.B    (a3)
  700.     Lea    aNumberString,a3
  701.     MoveQ.L    #0,d2                ; String length
  702. .whileNotEof2
  703.         Move.L    _DOSBase,a6
  704.         Move.L    a2,d1
  705.         CALL    FGetC
  706.         Tst.L    d0
  707.         Bmi.S    .return1
  708.  
  709.             Cmp.B    #10,d0
  710.             Beq.S    .numberStringRead
  711.  
  712.                 Move.B    d0,(a3)+
  713.                 
  714.                 AddQ.L    #1,d2
  715.                 Cmp.W    #10,d2
  716.                 Beq.S    .return1
  717.     Bra.S    .whileNotEof2
  718. .numberStringRead
  719.     SubQ.W    #2,d2
  720.     MoveQ.L    #0,d3
  721.     Lea    aNumberString,a3
  722.  
  723.     Sub.B    #'0',(a3)
  724.     Add.B    (a3)+,d3
  725.     Tst.W    d2
  726.     Bmi.S    .stringConverted
  727. .convertToInt
  728.         Move.L    d3,d4
  729.         Swap    d4
  730.         Mulu.W    #10,d4
  731.         Swap    d4
  732.         Clr.W    d4
  733.         Mulu.W    #10,d3
  734.         Add.L    d4,d3
  735.         
  736.         Sub.B    #'0',(a3)
  737.         Add.B    (a3)+,d3
  738.  
  739.     Dbf    d2,.convertToInt
  740. .stringConverted
  741.     Move.L    d3,(a4)
  742.  
  743. .return2
  744.     MoveQ.L    #2,d0
  745.     Rts
  746.  
  747. .return0
  748.     MoveQ.L    #0,d0
  749.     Rts
  750.  
  751. .return1
  752.     MoveQ.L    #1,d0
  753.     Rts
  754.  
  755. *******************************************************************************
  756. * Struct declarations
  757. *******************************************************************************
  758.  
  759.         RSRESET
  760. ;ListNode
  761. next        Rs.L    1
  762. libraryName    Rs.L    1
  763. openCount    Rs.L    1
  764. ListNodeSizeOf    Rs.B    0
  765.  
  766. *******************************************************************************
  767. * Data section
  768. *******************************************************************************
  769.  
  770.         SECTION Datas, Data
  771.  
  772. DefaultFileName    Dc.B    'S:LibraryOpenCount',0
  773. DosName        Dc.B    'dos.library',0
  774. IllegalLibName    Dc.B    '[Illegal]',0
  775. ReadArgsTempl    Dc.B    'L=LOGFILENAME,I=SAVEINTERVAL/N',0
  776.  
  777. ; fprintf data
  778.  
  779. FprintfString    Dc.B    '%s\t%lu\n',0
  780.  
  781.         Dc.B    '$VER: OpenLibraryCounter 1.13 (1997-08-22)',0
  782.  
  783. *******************************************************************************
  784. * BSS section
  785. *******************************************************************************
  786.  
  787.         SECTION    BSSs, BSS
  788.  
  789. ; Linked list
  790.  
  791. head        Ds.L    1
  792. numberOfOpens    Ds.L    1
  793.  
  794. ; Misc variables
  795.  
  796. _DOSBase    Ds.L    1
  797. myMessagePort    Ds.L    1
  798. anOpenCount    Ds.L    1
  799. filePointer    Ds.L    1
  800. oldOpenLibrary    Ds.L    1
  801.  
  802. readArgsArray    Ds.L    2
  803. userFileName    Ds.L    1
  804. saveInterval    Ds.L    1
  805.  
  806. readArgsStruct    Ds.L    1
  807.  
  808. aLibraryName    Ds.B    1025
  809. aNumberString    Ds.B    10
  810.  
  811. ; fprintf variables
  812.  
  813. variableArray    Ds.L    2
  814.